package myou.util;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder; 
/**
 * Projeto Myou - Disciplina: Sistemas de Informação I
 * Classe responsável por ler o arquivo de configuração
 * Design Pattern: Singletons
 * @author Ronycley Gonçalves Agra
 * @version 1.00
 * @since Milestone 2 17/10/2011
 */
public class LeitorConfiguracao {

	private Element root;
	private static LeitorConfiguracao instance;
	
	/**
	 * @param caminhoArquivo O caminho do arquivo de configuração
	 * @throws Exception Lança execção caso ocorra problemas na leitura do 
	 * arquivo de configuração
	 */
	protected LeitorConfiguracao() throws Exception{
		SAXBuilder builder = new SAXBuilder();
		try{
			Document doc = builder.build(new File("src/myou/model/Configuracao.xml"));
			this.root = doc.getRootElement();
		}catch(Exception e){
			throw e;
		}
	}
	
	
	/**
	 * Método que retorna  a lista dos nomes dos módulos passados como parametro
	 * @return Uma lista com os nomes dos múdulos registrados no arquivo de configuração
	 */
	public List<String[]> getModulos(){
		Iterator<Element> i = this.getIteratorModulos();
		List<String[]> nomeModulos = new ArrayList<String[]>();
		while (i.hasNext()) {
			Element modulo = i.next();
			String[] moduloOrdenado = {modulo.getChild("ordem").getText(),modulo.getChild("nome").getText()};
			nomeModulos.add(moduloOrdenado);
		}
		return nomeModulos;
	}
	
	
	/**
	 * Retorna uma lista com os nomes das ações do módulo passado como parametro
	 * @param nomeModulo O nome do módulo
	 * @return A lista com os nomes das ações do módulo passado como parametro
	 */
	public List<String[]> getAcoes(String nomeModulo){
		Iterator<Element> i = this.getIteratorModulos();
		List<String[]> acoes = new ArrayList<String[]>();
		while (i.hasNext()) {
			Element modulo = i.next();
			if(modulo.getChild("ordem").getText().equals(nomeModulo)){
				Iterator<Element> i2 = modulo.getChildren("acao").iterator();
				while (i2.hasNext()) {
					Element acao = i2.next(); 
					String[] acaoOrdenada = {acao.getChild("ordem").getText(),acao.getChild("textoExibicao").getText()};
					acoes.add(acaoOrdenada);
				}
				break;
			}
		}
		return acoes;
	} 
	
	/**
	 * Retorna nome do método que será invocado na Visão
	 * @param ordemModulo A ordem do módulo
	 * @param ordemAcao A ordem da ação
	 * @return O nome do método que será invocado na Visão
	 */
	public String getNomeMetodoVisao(String ordemModulo, String ordemAcao) {
		Iterator<Element> i = this.getIteratorModulos();
		List<String[]> acoes = new ArrayList<String[]>();
		while (i.hasNext()) {
			Element modulo = i.next();
			if(modulo.getChild("ordem").getText().equals(ordemModulo)){
				Iterator<Element> i2 = modulo.getChildren("acao").iterator();
				while (i2.hasNext()) {
					Element acao = i2.next(); 
					if(acao.getChild("ordem").getText().equals(ordemAcao)){
						return acao.getChild("nomeMetodoVisao").getText();
					}
				}
			}
		}
		return "";
	}
	
	/**
	 * Retorna nome do método que será invocado no Controlador
	 * @param ordemModulo A ordem do módulo
	 * @param ordemAcao A ordem da ação
	 * @return O nome do método que será invocado na Visão
	 */
	public String getNomeMetodoModelo(String ordemModulo, String ordemAcao) {
		Iterator<Element> i = this.getIteratorModulos();
		List<String[]> acoes = new ArrayList<String[]>();
		while (i.hasNext()) {
			Element modulo = i.next();
			if(modulo.getChild("ordem").getText().equals(ordemModulo)){
				Iterator<Element> i2 = modulo.getChildren("acao").iterator();
				while (i2.hasNext()) {
					Element acao = i2.next(); 
					if(acao.getChild("ordem").getText().equals(ordemAcao)){
						return acao.getChild("nomeMetodoMoelos").getText();
					}
				}
			}
		}
		return "";
	}
	
	/**
	 * Método que retorna o nome do gerete do modulo especificado
	 * @param ordemModulo a ordem do módulo
	 * @return O nome do gerete do modulo especificado
	 */
	public String getNomeGerente(String ordemModulo){
		Iterator<Element> i = this.getIteratorModulos();
		while (i.hasNext()) {
			Element modulo = i.next();
			if(modulo.getChild("ordem").getText().equals(ordemModulo)){
				return modulo.getChild("gerente").getText();
			}
		}
		return "";
	}
	
	/**
	 * Método que retorna um iterador para a lista dos módulos
	 * @return O iterador para a lista dos módulos
	 */
	private Iterator<Element> getIteratorModulos(){
		List<Element> modulos = this.root.getChildren("modulo");
		Iterator<Element> i = modulos.iterator();
		return i;
	}


	/**
	 * Método que retorna a instancia única do LeitorConfiguracao (Singleton)
	 * @return uma instancia de LeitorConfiiguracao
	 * @throws Exception Lança exceção caso ocorra algum problema na leitura do 
	 * arquivo de configuração.
	 */
	public synchronized static LeitorConfiguracao getInstance() throws Exception {
		try{
			if(instance == null){
				instance = new LeitorConfiguracao();
			}
			return instance;
		}catch(Exception e){
			throw e;
		}
	}
}
